/*
 * Funambol is a mobile platform developed by Funambol, Inc. 
 * Copyright (C) 2008 Funambol, Inc.
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by
 * the Free Software Foundation with the addition of the following permission 
 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
 * WORK IN WHICH THE COPYRIGHT IS OWNED BY FUNAMBOL, FUNAMBOL DISCLAIMS THE 
 * WARRANTY OF NON INFRINGEMENT  OF THIRD PARTY RIGHTS.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Affero General Public License 
 * along with this program; if not, see http://www.gnu.org/licenses or write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301 USA.
 * 
 * You can contact Funambol, Inc. headquarters at 643 Bair Island Road, Suite 
 * 305, Redwood City, CA 94063, USA, or at email address info@funambol.com.
 * 
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License version 3.
 * 
 * In accordance with Section 7(b) of the GNU Affero General Public License
 * version 3, these Appropriate Legal Notices must retain the display of the
 * "Powered by Funambol" logo. If the display of the logo is not reasonably 
 * feasible for technical reasons, the Appropriate Legal Notices must display
 * the words "Powered by Funambol".
 */
#include "base/fscapi.h"

#include "base/util/StringBuffer.h"
#include "event/SyncItemListener.h"
#include "event/SyncSourceListener.h"
#include "client/DMTClientConfig.h"
#include "client/SyncClient.h"
#include "event/ManageListener.h"
#include "spds/SyncSourceConfig.h"

#include "iPhoneDefaultConfigFactory.h"
#include "AddressBookSyncSource.h"
#ifndef FUNAMBOL_APP_STORE
#include "NoteSyncSource.h"
#include "EventSyncSource.h"
#endif

//#define DEVICEID "iph-default"

using namespace Funambol;


class FunambolAPIWrapperImpl {
private:
    static FunambolAPIWrapperImpl* apiWrapperImpl;
    DMTClientConfig* clientConfig;
    StringBuffer server;// = "funambol/";
    AddressBookSyncSource* abss;
#ifndef FUNAMBOL_APP_STORE
    NoteSyncSource* nss;
    EventSyncSource* ess;
#endif
    
    bool contactIsSyncing;
    bool calendarIsSyncing;
    bool noteIsSyncing;
    
    FunambolAPIWrapperImpl();
    ~FunambolAPIWrapperImpl();    
    
    void loadDefaultConfig();
    bool loadClientConfig(bool force = false);    
    
    SyncMode recoverDirection;
        
public:
    
    const static int CANNOT_OPEN_CONFIG_ERR      = 1;
    const static int URL_NOT_CONFIGURED_ERR      = 2;
    const static int NO_SOURCE_CONFIGURED_ERR    = 3;
    const static int SOURCE_NOT_CONFIGURED_ERR   = 4;
    const static int CANNOT_CREATE_SOURCE_ERR    = 5;
    const static int CANNOT_READ_ACCESS_CONF_ERR = 6;
        
    static FunambolAPIWrapperImpl* getInstance();
    static void dispose() { delete apiWrapperImpl; };
    
    /**
     * Client Initialization method.
     * - set the device id 
     *       ipt-xxxxxxx for ipod Touch
     *       iph-xxxxxxx for iphone
     *   the common part of the deviceID is created enconding with b64 the UUID of the device
     * - if the config is present in the device filesystem just read. If the configuration is not 
     *   present the method call iPhoneDefaultConfigFactory to create the default factory
     * - verifies also if the Database for the Addressbook
     */
    void initializeClient();
    
    void stopSyncContacts();    
    void stopSyncAndExit();
    int sync(id listener, const char* soucename);
    int doSync(id listener, const char* syncSourceName);
    int cleanup(const char* syncsourcename);
    int doCleanup(const char* syncsourcename);
    void setRecoverMode(SyncMode mode);
    int recoverContacts(id listener);
    int doRecoverContacts(id listener);
    int getLastSyncDate(const char* sourceName);    
    const char* getSync(const char* sourceName);    
    void setSync(const char* sourceName, const char* syncModes);    
    const char* getURI(const char* sourceName);    
    void setURI(const char* sourceName, const char* URI);    
    void resetSyncDate(const char* sourceName);
    AddressBookSyncSource* getAddressBookSyncSource();
    
#ifndef FUNAMBOL_APP_STORE
    NoteSyncSource* getNoteSyncSource();
    EventSyncSource* getEventSyncSource();
#endif
    
    void saveSyncConfig(const char* url, const char* username, const char* password);    
    void saveURL(const char* url);    
    void saveUsername(const char* username);    
    void savePassword(const char* password);    
    const char* loadUserNameFromSyncConfig() ;    
    const char* loadPasswordFromSyncConfig();    
    const char* loadUrlFromSyncConfig();    
    void setLogLevel(int loglevel);    
    int getLogLevel(){return clientConfig->getDeviceConfig().getLogLevel();}
};


